package hocusPocus.IHM;

import hocusPocus.Cartes.Carte;
import hocusPocus.Partie.Joueur;
import hocusPocus.Partie.Plateau;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.Hashtable;

import javax.imageio.ImageIO;
import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JToggleButton;
import javax.swing.WindowConstants;
import javax.swing.border.TitledBorder;

import com.mortennobel.imagescaling.experimental.ImprovedMultistepRescaleOp;

import java.awt.BorderLayout;

import javax.swing.BoxLayout;

import java.awt.Component;
import java.awt.Toolkit;

public class EchangerMainGrimoire extends JFrame {
	private Plateau plateau;
	private Joueur joueurCourant;
	private Hashtable<JToggleButton, Carte> tableCorrespondance;
	private Carte carteSelectionneeMain;
	private Carte carteSelectionneeGrimoire;
	private InterfacePlateau interfacePlateau;
	private JButton btnEchanger;

	public EchangerMainGrimoire(final InterfacePlateau interfacePlateau) {
		setIconImage(Toolkit.getDefaultToolkit().getImage(EchangerMainGrimoire.class.getResource("/images/icone.gif")));
		setResizable(false);
		final ButtonGroup groupeBoutonsCartesGrimoire = new ButtonGroup();
		final ButtonGroup groupeBoutonsCartesMain = new ButtonGroup();
		plateau = Plateau.getInstance();
		joueurCourant = plateau.getJoueurCourant();
		tableCorrespondance = new Hashtable<JToggleButton, Carte>();
		this.interfacePlateau = interfacePlateau;
		getContentPane().setLayout(new GridLayout(1, 1, 0, 0));

		this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		this.setResizable(true);
		this.setSize(766, 650);
		this.setTitle("Echanger carte main grimoire");

		BufferedImage imageCarte = null;
		JPanel panel = new JPanel();
		getContentPane().add(panel);
		panel.setLayout(new GridLayout(3, 1, 0, 0));

		JPanel panelMain = new JPanel();
		panelMain.setBorder(new TitledBorder(null, "Main", TitledBorder.LEFT,
				TitledBorder.TOP, null, null));
		panel.add(panelMain);

		JPanel panelGrimoire = new JPanel();
		panelGrimoire.setBorder(new TitledBorder(null, "Grimoire",
				TitledBorder.LEFT, TitledBorder.TOP, null, null));
		panel.add(panelGrimoire);

		JPanel Boutons = new JPanel();
		panel.add(Boutons);
		GridBagLayout gbl_Boutons = new GridBagLayout();
		gbl_Boutons.columnWidths = new int[] { 399, 349, 25 };
		gbl_Boutons.rowHeights = new int[] { 110, 23, 0 };
		gbl_Boutons.columnWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
		gbl_Boutons.rowWeights = new double[] { 0.0, 0.0, Double.MIN_VALUE };
		Boutons.setLayout(gbl_Boutons);

		btnEchanger = new JButton("Echanger");
		btnEchanger.setAlignmentX(Component.CENTER_ALIGNMENT);
		btnEchanger.setEnabled(false);
		btnEchanger.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				if (carteSelectionneeGrimoire != null
						&& carteSelectionneeMain != null) {
					System.out.println("Echange des cartes selectionnees !");
					joueurCourant.echangerMainGrimoire(carteSelectionneeMain,
							carteSelectionneeGrimoire);
					interfacePlateau.rafraichirPanelListeJoueurs();
					interfacePlateau.rafraichirPanelJoueurCourant();
					dispose();
				}
			}
		});
		GridBagConstraints gbc_btnEchanger = new GridBagConstraints();
		gbc_btnEchanger.gridx = 0;
		gbc_btnEchanger.gridy = 1;
		Boutons.add(btnEchanger, gbc_btnEchanger);

		JButton btnAnnuler = new JButton("Annuler");
		btnAnnuler.setAlignmentX(Component.CENTER_ALIGNMENT);
		btnAnnuler.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				dispose();
			}
		});
		GridBagConstraints gbc_btnAnnuler = new GridBagConstraints();
		gbc_btnAnnuler.gridx = 1;
		gbc_btnAnnuler.gridy = 1;
		Boutons.add(btnAnnuler, gbc_btnAnnuler);

		for (int i = 0; i < joueurCourant.getGrimoire().size(); i++) { // Affichage
																		// grimoire
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurCourant.getGrimoire().get(i).getRecto(),
					95, 160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurCourant.getGrimoire().get(i)
					.getInfoBulle());
			panelGrimoire.add(jbutton);
			groupeBoutonsCartesGrimoire.add(jbutton);
			tableCorrespondance
					.put(jbutton, joueurCourant.getGrimoire().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if ((JToggleButton) arg0.getSource() != null)
						carteSelectionneeGrimoire = tableCorrespondance
								.get((JToggleButton) arg0.getSource());
					if (carteSelectionneeMain != null)
						btnEchanger.setEnabled(true);
				}
			});
		}
		for (int i = 0; i < joueurCourant.getMain().size(); i++) { // Affichage
																	// main
			JToggleButton jbutton = new JToggleButton("");
			imageCarte = resize(joueurCourant.getMain().get(i).getRecto(), 95,
					160);
			jbutton.setIcon(new ImageIcon(imageCarte));
			jbutton.setToolTipText(joueurCourant.getMain().get(i)
					.getInfoBulle());
			panelMain.add(jbutton);
			groupeBoutonsCartesMain.add(jbutton);
			tableCorrespondance.put(jbutton, joueurCourant.getMain().get(i));
			jbutton.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if ((JToggleButton) arg0.getSource() != null)
						carteSelectionneeMain = tableCorrespondance
								.get((JToggleButton) arg0.getSource());
					if (carteSelectionneeGrimoire != null)
						btnEchanger.setEnabled(true);
				}
			});
		}
		this.setLocationRelativeTo(null);
		this.setVisible(true);
	}

	public static BufferedImage resize(String nomImageCarte, int width,
			int height) {
		BufferedImage img = null;
		ImprovedMultistepRescaleOp resampleOp = new ImprovedMultistepRescaleOp(
				width, height);
		try {
			img = ImageIO.read(new File("./src/images/"
					+ nomImageCarte.replace("hocusPocus.Cartes.", "")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		return resampleOp.filter(img, null);
	}
}
